package com.example.demo.zookeeper;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.apache.zookeeper.server.auth.DigestAuthenticationProvider;

import java.util.ArrayList;
import java.util.List;

public class ZookeeperClient {
    public static final String ADDRESS = "172.20.52.22:1218";
    public static void main(String[] args) throws Exception {
        //创建连接 地址，会话超时时间，连接监听器
        ZooKeeper zooKeeper = new ZooKeeper(ADDRESS,5000,new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                System.out.println("有监听事件进来了，事件信息 " + watchedEvent);
            }
        });

        //由于new 完Zookeeper对象就会创建，而不会在意是否连接上了，所以这里阻塞以下，直至连接成功（网上很多例子用的是CountDownLatch方式）
        while (zooKeeper.getState() != ZooKeeper.States.CONNECTED){
            System.out.println("连接中...");
            Thread.sleep(300);
        }


        /**
         *   创建节点参数
         *   节点路径 相当于文件目录一样，zk根节点是 / ,注意创建节点时，一定要以 / 开头
         *   节点数据 节点想要保存的数据，（如果附带服务ip端口信息，zk就当作了注册中心，客户端可拉取服务信息进行访问）
         *   节点权限 zk的acl权限，这里设置的是所有人可读，具体权限前面放的地址有解释
         *   节点类型（永久的、临时的、顺序性的，根据枚举名自行翻译。不了解节点类型，请先根据前面连接熟悉一下，或自行搜索了解一下）
         */


        List<ACL> acls = new ArrayList<ACL>();  // 权限列表
        // 第一个参数是权限scheme，第二个参数是加密后的用户名和密码
        Id user1 = new Id("digest", DigestAuthenticationProvider.generateDigest("super:Sailing@2020"));
        acls.add(new ACL(ZooDefs.Perms.ALL, user1));  // 给予所有权限
        // 多个权限的给予方式，使用 | 位运算符, 例如 acls.add(new ACL(ZooDefs.Perms.DELETE | ZooDefs.Perms.CREATE, user2))
        // 使用自定义的权限列表去创建节点
        String path1 = zooKeeper.create("/dscg/ss", "vdvsbvsb".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("success create znode:"+ path1);

//        //添加权限，否则get数据时就会报错。因为创建节点 /client-acl 时添加了自定义权限
//        zooKeeper.addAuthInfo("digest","admin1:admin1".getBytes());
//        byte[] data = zooKeeper.getData("/client-acl",null,null);
//        System.out.println(new String(data));

        zooKeeper.close();
    }
}
